package com.xbk.seckill.common.lock;

import java.util.concurrent.TimeUnit;

/**
 * 分布式锁接口
 *
 * @author xiexu
 * @date 2025/1/31 12:04
 */
public interface DistributedLock {

    /**
     * 尝试在指定时间内获取锁，如果成功获取，则自动在指定时间后释放锁
     *
     * @param waitTime  尝试获取锁的最大等待时间
     * @param leaseTime 成功获取锁后，锁持有的时间
     * @param unit      时间单位
     * @return
     * @throws InterruptedException
     */
    boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;

    /**
     * 尝试立即获取锁（不等待）
     *
     * @return
     * @throws InterruptedException
     */
    boolean tryLock() throws InterruptedException;

    /**
     * 获取锁
     *
     * @param leaseTime 锁持有的时间
     * @param unit      时间单位
     */
    void lock(long leaseTime, TimeUnit unit);

    /**
     * 释放锁
     */
    void unlock();

    /**
     * 判断锁是否被任意线程持有
     *
     * @return
     */
    boolean isLocked();

    /**
     * 判断指定线程是否持有该锁
     *
     * @param threadId
     * @return
     */
    boolean isHeldByThread(long threadId);

    /**
     * 判断当前线程是否持有该锁
     *
     * @return
     */
    boolean isHeldByCurrentThread();

}
